library(tidyverse)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
library(janitor)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
steam <- read_csv("raw_data/steam_checkpoint.csv")
Rows: 26564 Columns: 22── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (8): name, developer, publisher, multiplayer, categories, genres, steamspy_tags, owners
dbl  (8): appid, required_age, achievements, positive_ratings, negative_ratings, average_playtime, median_playtime, price
lgl  (5): free_to_play, virtual_reality_support, windows_support, mac_support, linux_support
date (1): release_date
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

Where was i?

games_pre_cleaned <- read_csv("raw_data/Cleaned Data 2 GVGS&R.csv")
Rows: 6894 Columns: 15── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (5): Name, Genre, Publisher, Developer, Rating
dbl (10): Year_of_Release, NA_Sales, EU_Sales, JP_Sales, Other_Sales, Global_Sales, Critic_Score, Critic_Count, User_Score, User_Count
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
Error in assign(cacheKey, frame, .rs.CachedDataEnv) : 
  attempt to use zero-length variable name
games_pre_cleaned

How dare you do the work for me

games_raw <- read_csv("raw_data/Raw Data GVGS&R.csv")
Rows: 16719 Columns: 16── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (8): Name, Platform, Year_of_Release, Genre, Publisher, User_Score, Developer, Rating
dbl (8): NA_Sales, EU_Sales, JP_Sales, Other_Sales, Global_Sales, Critic_Score, Critic_Count, User_Count
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
games_raw %>% 
  filter(Name == "Minecraft")

Why does everyone have the same dataset

back to steam i guess

steam
steam %>% 
  distinct(genres)

Already have F2P covered by another column, so we can drop that in genres

steam %>% 
  mutate(genres = str_remove_all(genres, "Free to Play")) %>% 
  filter(free_to_play == TRUE)

Is this worth doing? Duplicated info doesn’t hurt i suppose - leave it for now

single player?

steam <- steam %>% 
  mutate(singleplayer = case_when(
    str_detect(categories, "Single-player") ~ TRUE,
    str_detect(steamspy_tags, "Singleplayer") ~ TRUE,
    TRUE ~ FALSE
  ),.before = multiplayer)
steam %>% 
  filter(free_to_play == TRUE) 
backloggd <- read_csv("clean_data/backloggd_clean.csv")
Rows: 1115 Columns: 15── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (9): title, team, genre_tag, genre_tag_2, genre_tag_3, genre_tag_4, genre_tag_5, genre_tag_6, genre_tag_7
dbl  (5): years_since_release, rating, number_of_reviews, wishlist, plays
date (1): release_date
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
backloggd
games_raw <- games_raw %>% 
  clean_names()
# Platform isn't a genre - correcting
games_raw <- games_raw %>% 
  mutate(genre = case_when(
    genre == "Platform" ~ "Platformer",
    TRUE ~ genre
  ))
nintendo_published <- games_raw %>% 
  filter(publisher == "Nintendo")
genre_publisher_sales <- games_raw %>%  
  group_by(publisher, genre) %>% 
  summarise(sum(global_sales)) %>% 
  arrange(desc(`sum(global_sales)`))
`summarise()` has grouped output by 'publisher'. You can override using the `.groups` argument.
write_csv(genre_publisher_sales, "clean_data/genre_by_publisher.csv")
# Adding PEGI equivalent 
games_raw <- games_raw %>% 
  mutate(pegi_equivalent = case_when(
    esrp == "EC" ~ "3",
    esrp == "E" ~ "7",
    esrp == "E10+" ~ "12",
    esrp == "T" ~ "16",
    esrp == "M" ~ "18",
    esrp == "AO" ~ "18",
    esrp == "K-A" ~ "7",
    esrp == "RP" ~ "No Rating",
    TRUE ~ "No Rating Found"
  )) 
  

how does the sales for the top 3 genres look in each region?

What about trends? How did each genres sales adjust every 5 or so years?

sales_2019 <- read_csv("raw_data/sales-2019.csv")
Rows: 55792 Columns: 23── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (10): Name, basename, Genre, ESRB_Rating, Platform, Publisher, Developer, Last_Update, url, img_url
dbl (12): Rank, Critic_Score, User_Score, Total_Shipped, Global_Sales, NA_Sales, PAL_Sales, JP_Sales, Other_Sales, Year, status, Vgchartzscore
lgl  (1): VGChartz_Score
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Going off the fact that there is the majority of usable information i am able to get is from 2019 or before, we’re just going to pretend we’re living in an

alternative 2019

As such, i am dropping all data from 2020 in this dataset

Looking at backloggd again

backloggd %>% 
  mutate(rating_range = case_when(
    rating < 5 & rating >= 4 ~ "4+",
    rating < 4 & rating >= 3 ~ "3 to 4",
    rating < 3 & rating >= 2 ~ "2 to 3",
    rating < 2 & rating >= 1 ~ "1 to 2",
    rating < 1 ~ ">1",
    TRUE ~ "No rating"
  ))
LS0tDQp0aXRsZTogIkRBWSAyIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoamFuaXRvcikNCg0Kc3RlYW0gPC0gcmVhZF9jc3YoInJhd19kYXRhL3N0ZWFtX2NoZWNrcG9pbnQuY3N2IikNCmBgYA0KDQpXaGVyZSB3YXMgaT8NCg0KYGBge3J9DQpnYW1lc19wcmVfY2xlYW5lZCA8LSByZWFkX2NzdigicmF3X2RhdGEvQ2xlYW5lZCBEYXRhIDIgR1ZHUyZSLmNzdiIpDQpgYGANCg0KYGBge3J9DQpnYW1lc19wcmVfY2xlYW5lZA0KYGBgDQpIb3cgZGFyZSB5b3UgZG8gdGhlIHdvcmsgZm9yIG1lDQoNCmBgYHtyfQ0KZ2FtZXNfcmF3IDwtIHJlYWRfY3N2KCJyYXdfZGF0YS9SYXcgRGF0YSBHVkdTJlIuY3N2IikNCmBgYA0KDQpgYGB7cn0NCmdhbWVzX3JhdyAlPiUgDQogIGZpbHRlcihOYW1lID09ICJNaW5lY3JhZnQiKQ0KYGBgDQpXaHkgZG9lcyBldmVyeW9uZSBoYXZlIHRoZSBzYW1lIGRhdGFzZXQNCg0KYmFjayB0byBzdGVhbSBpIGd1ZXNzDQoNCmBgYHtyfQ0Kc3RlYW0NCmBgYA0KDQpgYGB7cn0NCnN0ZWFtICU+JSANCiAgZGlzdGluY3QoZ2VucmVzKQ0KYGBgDQoNCkFscmVhZHkgaGF2ZSBGMlAgY292ZXJlZCBieSBhbm90aGVyIGNvbHVtbiwgc28gd2UgY2FuIGRyb3AgdGhhdCBpbiBnZW5yZXMNCg0KYGBge3J9DQpzdGVhbSAlPiUgDQogIG11dGF0ZShnZW5yZXMgPSBzdHJfcmVtb3ZlX2FsbChnZW5yZXMsICJGcmVlIHRvIFBsYXkiKSkgJT4lIA0KICBmaWx0ZXIoZnJlZV90b19wbGF5ID09IFRSVUUpDQpgYGANCg0KSXMgdGhpcyB3b3J0aCBkb2luZz8NCkR1cGxpY2F0ZWQgaW5mbyBkb2Vzbid0IGh1cnQgaSBzdXBwb3NlIC0gbGVhdmUgaXQgZm9yIG5vdw0KDQpzaW5nbGUgcGxheWVyPw0KDQpgYGB7cn0NCnN0ZWFtIDwtIHN0ZWFtICU+JSANCiAgbXV0YXRlKHNpbmdsZXBsYXllciA9IGNhc2Vfd2hlbigNCiAgICBzdHJfZGV0ZWN0KGNhdGVnb3JpZXMsICJTaW5nbGUtcGxheWVyIikgfiBUUlVFLA0KICAgIHN0cl9kZXRlY3Qoc3RlYW1zcHlfdGFncywgIlNpbmdsZXBsYXllciIpIH4gVFJVRSwNCiAgICBUUlVFIH4gRkFMU0UNCiAgKSwuYmVmb3JlID0gbXVsdGlwbGF5ZXIpDQpgYGANCg0KYGBge3J9DQpzdGVhbSAlPiUgDQogIGZpbHRlcihmcmVlX3RvX3BsYXkgPT0gVFJVRSkgDQpgYGANCmBgYHtyfQ0Kc3RlYW0NCmBgYA0KYGBge3J9DQojIGFkZGluZyBjb2x1bW4gdG8gc2ltcGxpZnkgcmF0aW5ncyANCnN0ZWFtIDwtIHN0ZWFtICU+JSANCiAgbXV0YXRlKHRvdGFsX3Jldmlld3MgPSBwb3NpdGl2ZV9yYXRpbmdzICsgIG5lZ2F0aXZlX3JhdGluZ3MpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX3Jldmlld3MpKSAlPiUgDQogIG11dGF0ZShwZXJjZW50X3Bvc2l0aXZlX3Jldmlld3MgPSBwb3NpdGl2ZV9yYXRpbmdzIC8gdG90YWxfcmV2aWV3cykgJT4lIA0KICBtdXRhdGUoZ2VuZXJhbF9yYXRpbmcgPSBjYXNlX3doZW4oDQogICAgdG90YWxfcmV2aWV3cyA+IDEwMDAgJiBwZXJjZW50X3Bvc2l0aXZlX3Jldmlld3MgPj0gMC45NSB+ICJFeHRyZW1lbHkgUG9zaXRpdmUiLA0KICAgIHRvdGFsX3Jldmlld3MgPiAxMDAwICYgcGVyY2VudF9wb3NpdGl2ZV9yZXZpZXdzID49IDAuNzUgfiAiUG9zaXRpdmUiLA0KICAgIHRvdGFsX3Jldmlld3MgPiAxMDAwICYgcGVyY2VudF9wb3NpdGl2ZV9yZXZpZXdzID49IDAuNTUgfiAiTW9zdGx5IFBvc2l0aXZlIiwNCiAgICB0b3RhbF9yZXZpZXdzID4gMTAwMCAmIHBlcmNlbnRfcG9zaXRpdmVfcmV2aWV3cyA+PSAwLjUwIH4gIk1peGVkIiAsDQogICAgdG90YWxfcmV2aWV3cyA+IDEwMDAgJiBwZXJjZW50X3Bvc2l0aXZlX3Jldmlld3MgPj0gMC4zNSB+ICIgTW9zdGx5IE5lZ2F0aXZlIiwNCiAgICB0b3RhbF9yZXZpZXdzID4gMTAwMCAmIHBlcmNlbnRfcG9zaXRpdmVfcmV2aWV3cyA+PSAwLjE1IH4gIk5lZ2F0aXZlIiwNCiAgICB0b3RhbF9yZXZpZXdzID4gMTAwMCAmIHBlcmNlbnRfcG9zaXRpdmVfcmV2aWV3cyA8IDAuMTUgfiAiRXh0cmVtZWx5IE5lZ2F0aXZlIiwNCiAgICBwb3NpdGl2ZV9yYXRpbmdzID09IDAgfiAiTm8gUG9zaXRpdmUgUmV2aWV3cyIsDQogICAgbmVnYXRpdmVfcmF0aW5ncyA9PSAwIH4gIk5vIE5lZ2F0aXZlIFJldmlld3MiLA0KICAgIHBvc2l0aXZlX3JhdGluZ3MgJiBuZWdhdGl2ZV9yYXRpbmdzID09IDAgfiAiTm8gUmV2aWV3cyIsDQogICAgdG90YWxfcmV2aWV3cyA8IDEwMDAgfiAiTm90IEVub3VnaCBSZXZpZXdzIiwNCiAgICBUUlVFIH4gIk5vIERhdGEiDQogICksLmJlZm9yZSA9IHBvc2l0aXZlX3JhdGluZ3MpICU+JSANCiAgc2VsZWN0KC1wZXJjZW50X3Bvc2l0aXZlX3Jldmlld3MpDQpgYGANCg0KDQoNCmBgYHtyfQ0KYmFja2xvZ2dkIDwtIHJlYWRfY3N2KCJjbGVhbl9kYXRhL2JhY2tsb2dnZF9jbGVhbi5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KYmFja2xvZ2dkDQpgYGANCg0KDQpgYGB7cn0NCmdhbWVzX3JhdyA8LSBnYW1lc19yYXcgJT4lIA0KICBjbGVhbl9uYW1lcygpDQpgYGANCg0KYGBge3J9DQojIFBsYXRmb3JtIGlzbid0IGEgZ2VucmUgLSBjb3JyZWN0aW5nDQpnYW1lc19yYXcgPC0gZ2FtZXNfcmF3ICU+JSANCiAgbXV0YXRlKGdlbnJlID0gY2FzZV93aGVuKA0KICAgIGdlbnJlID09ICJQbGF0Zm9ybSIgfiAiUGxhdGZvcm1lciIsDQogICAgVFJVRSB+IGdlbnJlDQogICkpDQpgYGANCg0KYGBge3J9DQpuaW50ZW5kb19wdWJsaXNoZWQgPC0gZ2FtZXNfcmF3ICU+JSANCiAgZmlsdGVyKHB1Ymxpc2hlciA9PSAiTmludGVuZG8iKQ0KYGBgDQoNCmBgYHtyfQ0KZ2VucmVfcHVibGlzaGVyX3NhbGVzIDwtIGdhbWVzX3JhdyAlPiUgIA0KICBncm91cF9ieShwdWJsaXNoZXIsIGdlbnJlKSAlPiUgDQogIHN1bW1hcmlzZShzdW0oZ2xvYmFsX3NhbGVzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYHN1bShnbG9iYWxfc2FsZXMpYCkpDQpgYGANCmBgYHtyfQ0Kd3JpdGVfY3N2KGdlbnJlX3B1Ymxpc2hlcl9zYWxlcywgImNsZWFuX2RhdGEvZ2VucmVfYnlfcHVibGlzaGVyLmNzdiIpDQpgYGANCg0KYGBge3J9DQpnZW5yZV9wdWJsaXNoZXJfc2FsZXMgJT4lIA0KICBmaWx0ZXIocHVibGlzaGVyID09ICJGcm9tIFNvZnR3YXJlIikNCmBgYA0KDQpgYGB7cn0NCmdhbWVzX3JhdyAlPiUgDQogIGRpc3RpbmN0KHJhdGluZykNCmBgYA0KDQoNCmBgYHtyfQ0KIyBjbGFyaWZ5aW5nIHRoYXQgdGhlIHJhdGluZyBpcyBmb3IgRVNSUCAtIHRoZSBhbWVyaWNhbiBzeXN0ZW0NCmdhbWVzX3JhdyA8LSBnYW1lc19yYXcgJT4lIA0KICByZW5hbWUoImVzcnAiID0gInJhdGluZyIpIA0KYGBgDQoNCmBgYHtyfQ0KIyBBZGRpbmcgUEVHSSBlcXVpdmFsZW50IA0KZ2FtZXNfcmF3IDwtIGdhbWVzX3JhdyAlPiUgDQogIG11dGF0ZShwZWdpX2VxdWl2YWxlbnQgPSBjYXNlX3doZW4oDQogICAgZXNycCA9PSAiRUMiIH4gIjMiLA0KICAgIGVzcnAgPT0gIkUiIH4gIjciLA0KICAgIGVzcnAgPT0gIkUxMCsiIH4gIjEyIiwNCiAgICBlc3JwID09ICJUIiB+ICIxNiIsDQogICAgZXNycCA9PSAiTSIgfiAiMTgiLA0KICAgIGVzcnAgPT0gIkFPIiB+ICIxOCIsDQogICAgZXNycCA9PSAiSy1BIiB+ICI3IiwNCiAgICBlc3JwID09ICJSUCIgfiAiTm8gUmF0aW5nIiwNCiAgICBUUlVFIH4gIk5vIFJhdGluZyBGb3VuZCINCiAgKSkgDQogIA0KYGBgDQoNCmBgYHtyfQ0KdG90YWxfc2FsZXNfYnlfZ2VucmUgPC0gZ2FtZXNfcmF3ICU+JSANCiAgZ3JvdXBfYnkoZ2VucmUpICU+JSANCiAgc3VtbWFyaXNlKHN1bShnbG9iYWxfc2FsZXMpKSAlPiUgDQogIHJlbmFtZSgidG90YWxfc2FsZXMiID0gInN1bShnbG9iYWxfc2FsZXMpIikgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfc2FsZXMpKQ0KYGBgDQoNCmBgYHtyfQ0KdG90YWxfc2FsZXNfYnlfZ2VucmUgPC0gdG90YWxfc2FsZXNfYnlfZ2VucmUgJT4lIA0KICBkcm9wX25hKCkNCmBgYA0KDQpgYGB7cn0NCmdhbWVzX3JhdyANCmBgYA0KDQpgYGB7cn0NCmJyZWFrZG93bl9zYWxlc19ieV9nZW5yZSA8LSBnYW1lc19yYXcgJT4lIA0KICBncm91cF9ieShnZW5yZSkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtKG5hX3NhbGVzKSwgc3VtKGV1X3NhbGVzKSwgc3VtKGpwX3NhbGVzKSwgc3VtKG90aGVyX3NhbGVzKSkgJT4lIA0KICByZW5hbWUoInRvdGFsX25hX3NhbGVzIj0gInN1bShuYV9zYWxlcykiLCAidG90YWxfZXVfc2FsZXMiID0gInN1bShldV9zYWxlcykiLCAidG90YWxfanBfc2FsZXMiID0gInN1bShqcF9zYWxlcykiLCAidG90YWxfb3RoZXJfc2FsZXMiID0gInN1bShvdGhlcl9zYWxlcykiKQ0KYGBgDQoNCmBgYHtyfQ0KdG90YWxfc2FsZXNfYnlfZ2VucmUgIyB0aGlzIHNlZW1zIHRvIGhhdmUgc29tZSByb3VuZGluZyBkaWZmZXJlbmNlcyBjb21wYXJlZCB0byBicmVha2Rvd24sIHNvIGknbGwgcmV0aXJlIHRoaXMgb25lIA0KYGBgDQpob3cgZG9lcyB0aGUgc2FsZXMgZm9yIHRoZSB0b3AgMyBnZW5yZXMgbG9vayBpbiBlYWNoIHJlZ2lvbj8NCg0KDQpgYGB7cn0NCmJyZWFrZG93bl9zYWxlc19ieV9nZW5yZSA8LSBicmVha2Rvd25fc2FsZXNfYnlfZ2VucmUgJT4lIA0KICBncm91cF9ieShnZW5yZSkgJT4lIA0KICBtdXRhdGUodG90YWxfc2FsZXMgPSBzdW0odG90YWxfbmFfc2FsZXMgKyB0b3RhbF9ldV9zYWxlcyArIHRvdGFsX2pwX3NhbGVzICsgdG90YWxfb3RoZXJfc2FsZXMpKSAlPiUgDQogIGRyb3BfbmEoKQ0KYGBgDQpgYGB7cn0NCg0KYnJlYWtkb3duX3NhbGVzX2J5X2dlbnJlICU+JSANCiAgZmlsdGVyKGdlbnJlICVpbiUgYygiQWN0aW9uIiwgIlNwb3J0cyIsICJTaG9vdGVyIikpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gdG90YWxfc2FsZXMsIHkgPSBnZW5yZSkpKw0KICBnZW9tX2NvbCgpICsNCiAgZ2VvbV9jb2woYWVzKHggPSB0b3RhbF9uYV9zYWxlcyksIGZpbGwgPSAiZ3JlZW4iKSsNCiAgZ2VvbV9jb2woYWVzKHggPSB0b3RhbF9ldV9zYWxlcyksIGZpbGwgPSAicmVkIikgKw0KICBnZW9tX2NvbChhZXMoeCA9IHRvdGFsX2pwX3NhbGVzKSwgZmlsbCA9ICJibHVlIikgDQoNCiMgdGhpcyBsb29rcyBzaGl0DQpgYGANCg0KV2hhdCBhYm91dCB0cmVuZHM/IEhvdyBkaWQgZWFjaCBnZW5yZXMgc2FsZXMgYWRqdXN0IGV2ZXJ5IDUgb3Igc28geWVhcnM/DQoNCmBgYHtyfQ0KZ2FtZXNfcmF3ICU+JSANCiAgZmlsdGVyKHllYXJfb2ZfcmVsZWFzZSA9PSAiMjAxNiIpDQoNCmdhbWVzX3JhdyAlPiUgDQogIG11dGF0ZSh5ZWFyX29mX3JlbGVhc2UgPSBhcy5pbnRlZ2VyKHllYXJfb2ZfcmVsZWFzZSkpICU+JSANCiAgZGlzdGluY3QoeWVhcl9vZl9yZWxlYXNlKSAlPiUgDQogIGFycmFuZ2UoeWVhcl9vZl9yZWxlYXNlKQ0KDQpgYGANCg0KYGBge3J9DQpzYWxlc18yMDE5IDwtIHJlYWRfY3N2KCJyYXdfZGF0YS9zYWxlcy0yMDE5LmNzdiIpDQpgYGANCg0KYGBge3J9DQpzYWxlc18yMDE5ICU+JSANCiAgZGlzdGluY3QoWWVhcikgJT4lIA0KICBhcnJhbmdlKGRlc2MoWWVhcikpDQpgYGANCmBgYHtyfQ0Kc2FsZXNfMjAxOSAlPiUgDQogIGZpbHRlcihZZWFyID09ICIyMDE5IikgJT4lIA0KICBzZWxlY3QoTmFtZSwgWWVhciwgUGxhdGZvcm0pDQoNCiMgZGF0YSBmb3IgMjAyMCBpcyB0b3RhbCBub25zZW5zZS4gU29tZSBpbmZvcm1hdGlvbiBpbiAyMDE5IGlzIGluY29ycmVjdC4NCmBgYA0KIyBHb2luZyBvZmYgdGhlIGZhY3QgdGhhdCB0aGVyZSBpcyB0aGUgbWFqb3JpdHkgb2YgdXNhYmxlIGluZm9ybWF0aW9uIGkgYW0gYWJsZSB0byBnZXQgaXMgZnJvbSAyMDE5IG9yIGJlZm9yZSwgd2UncmUganVzdCBnb2luZyB0byBwcmV0ZW5kIHdlJ3JlIGxpdmluZyBpbiBhbiANCiMgYWx0ZXJuYXRpdmUgMjAxOQ0KDQpBcyBzdWNoLCBpIGFtIGRyb3BwaW5nIGFsbCBkYXRhIGZyb20gMjAyMCBpbiB0aGlzIGRhdGFzZXQgDQoNCmBgYHtyfQ0Kc2FsZXNfMjAxOSA8LSBzYWxlc18yMDE5ICU+JSANCiAgZmlsdGVyKFllYXIgIT0gIjIwMjAiKQ0KYGBgDQoNCiMgTG9va2luZyBhdCBiYWNrbG9nZ2QgYWdhaW4NCg0KYGBge3J9DQpiYWNrbG9nZ2QNCmBgYA0KYGBge3J9DQojIGNyZWF0aW5nIGEgcmFuZ2VfcmF0aW5nIGNvbHVtbiB0byByZWR1Y2Ugbm9pc2Ugd2hlbiBpdCBjb21lcyB0byBwbG90dGluZyByZXN1bHRzDQpiYWNrbG9nZ2VkIDwtIGJhY2tsb2dnZCAlPiUgDQogIG11dGF0ZShyYXRpbmdfcmFuZ2UgPSBjYXNlX3doZW4oDQogICAgcmF0aW5nIDwgNSAmIHJhdGluZyA+PSA0IH4gIjQrIiwNCiAgICByYXRpbmcgPCA0ICYgcmF0aW5nID49IDMgfiAiMyB0byA0IiwNCiAgICByYXRpbmcgPCAzICYgcmF0aW5nID49IDIgfiAiMiB0byAzIiwNCiAgICByYXRpbmcgPCAyICYgcmF0aW5nID49IDEgfiAiMSB0byAyIiwNCiAgICByYXRpbmcgPCAxIH4gIj4xIiwNCiAgICBUUlVFIH4gIk5vIHJhdGluZyINCiAgKSkNCmBgYA0KDQoNCg0K